/* 
 * File:   main.c
 * Author: vagner
 *
 * Created on 10 de Março de 2012, 13:58
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Lista_Aluno.h"
#include "Lista_Universidade.h"



/*Programa que resolve o Problema dos Casamentos Estáveis (SMP)
 * com base no algoritmo de Gale-Shapley. * 
 */
int main(int argc, char** argv) {
    
    char nome_entrada[80];
    char nome_saida[80];
    char* linha = NULL;
    int* dados_aluno;
    int j;
    int numero_instancias = 1; /*Menor numero possível de instâncias*/
    int numero_alunos = 2; /*Menor numero possível de individuos*/
    int numero_universidades = 1;
    int vaga_universidade;
    int max_lista_pref;
    int tam_lista_pref;
    int instancias_executadas = 0;
    FILE* arquivo_entrada;
    FILE* arquivo_saida;
    int i;
    int* lista_preferencia = NULL;
    Aluno* a = NULL;
    universidade* u = NULL;
        
    Lista_Aluno alunos = cria_lista_aluno();
    Lista_Universidade universidades = cria_lista_universidades();
    
    /*Validando a sintaxe conforme padrão tp0 -i 'nome do arquivo de entrada'*/
    valida_sintaxe(argc,argv,nome_entrada,nome_saida);
    
    arquivo_entrada = (FILE*) abre_arquivo(nome_entrada,"r");
    arquivo_saida = (FILE*) abre_arquivo(nome_saida,"w");
    
    /*Iniciamos lendo  a primeira linha do arquivo de entrada para descobrimos
     * o número de instancias do problema.
     */
    linha = (char*) le_linha(arquivo_entrada);    
    if((sscanf(linha,"%d",&numero_instancias))!= 1){
        printf("Erro ao definir o numero de instancias da aplicacao\n");
        exit(-8);
    }
    
    /*Definido o número de instâncias do problema, podemos recuperar
     * o número de individuos para casa instância e descobrir os casamentos 
     * estáveis para estes conjuntos.
     */
    while(instancias_executadas < numero_instancias){
        
        /*Definido o numero de indivíduos de uma determinada instância do
         * problema.
         */
        linha = (char*) le_linha(arquivo_entrada);       
        if((sscanf(linha,"%d %d %d",&numero_alunos, &numero_universidades, 
                   &max_lista_pref))!= 3){
        printf("Erro em definir numero de inviduos\n");
        exit(-9);
        }
                
        /*Lista de preferência é uma variável auxiliar que armazerá
         * provisóriamente a lista de preferência de um determinado indíviduo.
         * Como o tamamho da lista pode variar, iremos alocar dinamicamente
         * o espaço necessário para armazenar tal informação.
         */
        lista_preferencia = (int*) malloc(max_lista_pref*sizeof(int));
        if(lista_preferencia == NULL){
            printf("Erro ao alocar memoria para a lista de preferencia.\n");
            exit(-10);
        }
        
        /*Populando a lista de alunos*/
        for(i=0;i<numero_alunos;i++){
            linha = (char*) le_linha(arquivo_entrada);
            string_para_vetorint(linha,&dados_aluno,&tam_lista_pref);
            a = cria_aluno(i+1,dados_aluno,tam_lista_pref-1);
            insere_aluno(&alunos,a);          
        }
        
        /*Populando a lista de mulheres*/
        for(i=0;i<numero_universidades;i++){
        linha = (char*) le_linha(arquivo_entrada);
        
        if((sscanf(linha,"%d",&vaga_universidade))!= 1){
        printf("Erro em definir numero de inviduos\n");
        exit(-9);
        }
        u = cria_universidade(i+1,vaga_universidade);
        insere_universidade(&universidades,u); 
        }
                     
        /*Definindo os casamentos estáveis com base na lista de homens e 
         * mulheres e no número de indíviduos em casa lista. O resultado estará
         * no arquivo output.txt
         */
        //imprime_lista_aluno(alunos);
        //imprime_lista_universidades(universidades);
        smpi(alunos,universidades,1,arquivo_saida);
        instancias_executadas++;     
    }
    /*Desalocando a memória utilizada.*/
    /*remove_todos(&lista_homens);
    remove_todos(&lista_mulheres);
    desaloca_pessoa(h);
    desaloca_pessoa(m);
    free(lista_preferencia);
    fecha_arquivo(arquivo_entrada);*/
    printf("Criado arquivo %s com a saída do programa.\n", nome_saida);
    return (EXIT_SUCCESS);
}

